﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////

#pragma once

#include "GcmpModelInterface.h"
#include "GcmpDevService.h"
#include "GcmpApiDeclaration.h"
#include "IStandardCodeValueRange.h"
#include "NdbDataSchema.h"

namespace gcmp
{
    /// \brief 标准编码类型
    SERIALIZABLE_ENUM_CLASS(StandardCodeType)
    {
        Invalid = 0,            ///< 未知编码类型
        Classification = 1,     ///< 分类编码
        Attribute = 2,          ///< 属性编码
        Enumeration = 3         ///< 枚举类型
    };

    /// \brief 标准编码值类型
    SERIALIZABLE_ENUM_CLASS(StandardCodeValueType)
    {
        Invalid = 0,        ///< 未知类型
        Bool = 1,           ///< 布尔型
        Long = 2,           ///< 长整型
        Double = 3,         ///< 浮点型
        String = 4,         ///< 字符串型
        Enumeration = 5,    ///< 枚举型
        ReferenceCode = 6,  ///< 引用编码
        Value = 7           ///< 值，一般对应枚举值。
    };

    /// \brief 一个标准编码数据结构接口
    class GCMP_MODEL_INTERFACE_EXPORT IStandardCodeItem
    {
    public:
        virtual ~IStandardCodeItem();

        /// \brief 创建一个编码数据对象。创建出来后，用户需要设置每一个属性。
        /// 
        /// \return 返回创建出来的编码数据对象。
        static OwnerPtr<IStandardCodeItem> Create();

        /// \brief 设置编码。
        /// 
        /// \return 设置编码。
        virtual bool SetCode(const std::wstring& code) = 0;

        /// \brief 获取编码。
        /// 
        /// \return 返回编码。
        virtual const std::wstring& GetCode() const = 0;

        /// \brief 设置编码的名称。
        /// 
        /// \return 设置编码的名称。
        virtual bool SetCodeName(const std::wstring& codeName) = 0;

        /// \brief 获取编码的名称。
        /// 
        /// \return 返回编码的名称。
        virtual const std::wstring& GetCodeName() const = 0;

        /// \brief 设置编码的值类型。
        /// 
        /// \return 设置编码的值类型。
        virtual bool SetCodeValueType(StandardCodeValueType valueType) = 0;

        /// \brief 获取编码的值类型。
        /// 
        /// \return 返回编码的值类型。
        virtual StandardCodeValueType GetCodeValueType() const = 0;

        /// \brief 获取编码的下一级子编码集合
        /// 
        /// \return 返回的下一级子编码集合
        virtual const std::vector<const IStandardCodeItem*>& GetSubStandardCodeItems() const = 0;

        /// \brief 设置编码的描述信息
        /// \param description 编码的描述信息
        /// \return void
        virtual void SetDescription(const std::wstring& description) = 0;

        /// \brief 获取编码的描述信息
        ///
        /// \return 返回编码的描述信息。
        virtual std::wstring GetDescription() const = 0;

        /// \brief 获取编码表，编码表为编码的前两位数字
        /// 
        /// \return 返回编码表。
        virtual std::wstring GetTableId() const = 0;

        /// \brief 获取标准编码数据的值域
        /// 
        /// \return 标准编码数据的值域
        virtual const IStandardCodeValueRange* GetStandardCodeValueRange() const = 0;

        /// \brief 设置编码助记符，助记符和编码一样，都是全局唯一的,在设置助记符符时请确保是全局唯一的
        /// 
        /// \return void
        virtual void SetCodeMnemonic(const std::wstring& codeMnemonic) = 0;

        /// \brief 获取编码助记符
        /// 
        /// \return 返回编码助记符
        virtual std::wstring GetCodeMnemonic() const = 0;


        /// \brief 获取该编码数据的值是否由公式计算得出
        /// 
        /// \return 编码数据的值由公式计算得出为true;否则返回false
        virtual bool IsDeterminedByFormula() const = 0;

        /// \brief 获取计算数据值的公式
        /// 
        /// 不论IsDeterminedByFormula接口返回的值为true还是false，均能通过该接口获取公式
        /// \return  计算数据值的公式
        virtual std::wstring GetFormula() const = 0;

    };
}

